package platzerworld.kegeln.gui;

import java.util.List;

import platzerworld.kegeln.R;
import platzerworld.kegeln.common.ConstantsIF;
import platzerworld.kegeln.common.KeyValueVO;
import platzerworld.kegeln.common.preference.KegelverwaltungPreference;
import platzerworld.kegeln.ergebnis.db.ErgebnisSpeicher;
import platzerworld.kegeln.ergebnis.vo.ErgebnisVO;
import platzerworld.kegeln.spieler.db.SpielerSpeicher;
import platzerworld.kegeln.spieler.vo.SpielerVO;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.os.Bundle;
import android.text.InputType;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnFocusChangeListener;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;

/**
 * Zeigt die Liste der Geokontakte an.
 * 
 * @author Arno Becker, David Müller 2010 visionera gmbh
 * 
 */
public class WettkampfPaarungEingeben extends Activity implements ConstantsIF {

	/** Kuerzel fuers Logging. */
	private static final String TAG = ErgebnisseAnzeigen.class.getSimpleName();
	
	private int defaultColor;
	
	private Button mSpeichernButton;
	private Button mAbbruchButton;
	
	static Spinner mSpielgruppeSpinner = null;
	
	private EditText edtGesamtergebnis;
	private EditText edtErgebnis501;
	private EditText edtErgebnis502;
	private EditText edtVolle251;
	private EditText edtVolle252;
	private EditText edtAbr251;
	private EditText edtAbr252;
	private EditText edtFehl251;
	private EditText edtFehl252;
	
	private int mSelectedSpielerItemPosition=0;

	private ErgebnisSpeicher mErgebnisSpeicher;
	private SpielerSpeicher mSpielerSpeicher;
	
	private SpielerVO mSpielerVO;
	private ErgebnisVO mErgebnisVO;
	private int mPaarungIndex=0;
	private String heimGast="";
	
	private boolean isEditMode = false;
	
	@Override
	protected void onCreate(Bundle icicle) {
		super.onCreate(icicle);
		Log.d(TAG, "onCreate(): entered...");
		setContentView(R.layout.wettkampf_paarung_eingeben);
		
		Bundle extras = getIntent().getExtras();
		if (extras == null) {
			return;
		}
		
		heimGast = extras.getString(INTENT_EXTRA_WETTKAMPF_HEIM_GAST);
		
		if("HEIM".equals(heimGast)){
			mErgebnisVO  = (ErgebnisVO) extras.getSerializable(INTENT_EXTRA_WETTKAMPF_ERGEBNIS_HEIM);
		}else{
			mErgebnisVO  = (ErgebnisVO) extras.getSerializable(INTENT_EXTRA_WETTKAMPF_ERGEBNIS_GAST);
		}
		
		mPaarungIndex = extras.getInt(INTENT_EXTRA_WETTKAMPF_PAARUNG);
		
		isEditMode = extras.getBoolean(INTENT_EXTRA_EDIT_MODE);
		
		init();
		
	}
	
	@Override
	protected void onRestoreInstanceState(Bundle savedInstanceState) {
		mErgebnisVO = (ErgebnisVO) savedInstanceState.getSerializable("Paarung-"+mPaarungIndex+"-"+heimGast);

		super.onRestoreInstanceState(savedInstanceState);
	}

	@Override
	protected void onSaveInstanceState(Bundle savedInstanceState) {
		saveValues();
		savedInstanceState.putSerializable("Paarung-"+mPaarungIndex+"-"+heimGast, mErgebnisVO);
		super.onSaveInstanceState(savedInstanceState);
	}

	@Override
	protected void onDestroy() {
		cleanDatabase();
		super.onDestroy();
	}
	
	@Override
	protected void onResume() {
		bindWidgets();
		loadPreference();
		mSpielgruppeSpinner.setSelection(mSelectedSpielerItemPosition);
		super.onResume();
	}
	
	@Override
	protected void onStart() {
		zeigeSpieler();
		super.onStart();
	}

	@Override
	protected void onPause() {
		savePreference();
		super.onPause();
	}

	private void init(){
		initStyle();
		initWidgets();
		initListener();
		initContextMenu();
		initDatabase();
	}
	
	private void bindWidgets(){
		edtGesamtergebnis.setText(String.valueOf(mErgebnisVO.gesamtergebnis));
		edtErgebnis501.setText(String.valueOf(mErgebnisVO.ergebnis501));
		edtErgebnis502.setText(String.valueOf(mErgebnisVO.ergebnis502));
		edtVolle251.setText(String.valueOf(mErgebnisVO.volle251));
		edtVolle252.setText(String.valueOf(mErgebnisVO.volle252));
		edtAbr251.setText(String.valueOf(mErgebnisVO.abraeumen251));
		edtAbr252.setText(String.valueOf(mErgebnisVO.abraeumen252));
		edtFehl251.setText(String.valueOf(mErgebnisVO.fehl251));
		edtFehl252.setText(String.valueOf(mErgebnisVO.fehl252));
	}
	
	private void saveValues(){
		errechneGesamtErgebnis();
	}
	
	private void initStyle() {
		defaultColor = getResources().getColor(R.color.TITEL_COLOR);
	}
	
	private void initWidgets(){
		
		mSpeichernButton = (Button) findViewById(R.id.sf_ergebnis_neuanlagen_ok);
		mAbbruchButton = (Button) findViewById(R.id.sf_ergebnis_neuanlagen_abbruch);
		
		mSpielgruppeSpinner = (Spinner) this.findViewById(R.id.sp_wettkampf_paarung_spieler);
		
		edtGesamtergebnis = (EditText) findViewById(R.id.edt_ergebnis_neuanlegen_gesamtergebnis);
		edtErgebnis501 = (EditText) findViewById(R.id.edt_ergebnis_neuanlegen_ergebnis_50_1);
		edtErgebnis502 = (EditText) findViewById(R.id.edt_ergebnis_neuanlegen_ergebnis_50_2);
		edtVolle251 = (EditText) findViewById(R.id.edt_ergebnis_neuanlegen_volle_50_1);
		edtVolle252 = (EditText) findViewById(R.id.edt_ergebnis_neuanlegen_volle_50_2);
		edtAbr251 = (EditText) findViewById(R.id.edt_ergebnis_neuanlegen_abraeumen_50_1);
		edtAbr252 = (EditText) findViewById(R.id.edt_ergebnis_neuanlegen_abraeumen_50_2);
		edtFehl251 = (EditText) findViewById(R.id.edt_ergebnis_neuanlegen_fehl_50_1);
		edtFehl252 = (EditText) findViewById(R.id.edt_ergebnis_neuanlegen_fehl_50_2);
		
		edtFehl251.setInputType(InputType.TYPE_CLASS_NUMBER);
		
		edtFehl251.setOnFocusChangeListener(new OnFocusChangeListener() {
			@Override
			public void onFocusChange(View v, boolean hasFocus) {
				if(hasFocus){
					refreshFehl1(v);
				}
			}
		});
		edtFehl252.setInputType(InputType.TYPE_CLASS_NUMBER);
		edtFehl252.setOnFocusChangeListener(new OnFocusChangeListener() {
			@Override
			public void onFocusChange(View v, boolean hasFocus) {
				if(hasFocus){
					refreshFehl2(v);
				}
			}
		});
	
		edtGesamtergebnis.setInputType(InputType.TYPE_CLASS_NUMBER);
		edtGesamtergebnis.setOnFocusChangeListener(new OnFocusChangeListener() {
			@Override
			public void onFocusChange(View v, boolean hasFocus) {
				if(hasFocus){
					v.setBackgroundColor(Color.rgb(255, 140, 0));
					edtErgebnis501.setBackgroundColor(defaultColor);
					edtErgebnis502.setBackgroundColor(defaultColor);
					edtVolle251.setBackgroundColor(defaultColor);
					edtVolle252.setBackgroundColor(defaultColor);
					edtAbr251.setBackgroundColor(defaultColor);
					edtAbr252.setBackgroundColor(defaultColor);
					edtFehl251.setBackgroundColor(defaultColor);
					edtFehl252.setBackgroundColor(defaultColor);
				}
			}
		});
		
		
		edtErgebnis501.setInputType(InputType.TYPE_CLASS_NUMBER);
		edtErgebnis501.setOnFocusChangeListener(new OnFocusChangeListener() {
			@Override
			public void onFocusChange(View v, boolean hasFocus) {
				if(hasFocus){
					v.setBackgroundColor(Color.rgb(255, 140, 0));
					edtGesamtergebnis.setBackgroundColor(defaultColor);
					edtErgebnis502.setBackgroundColor(defaultColor);
					edtVolle251.setBackgroundColor(defaultColor);
					edtVolle252.setBackgroundColor(defaultColor);
					edtAbr251.setBackgroundColor(defaultColor);
					edtAbr252.setBackgroundColor(defaultColor);
					edtFehl251.setBackgroundColor(defaultColor);
					edtFehl252.setBackgroundColor(defaultColor);
				}
			}
		});
		
		edtErgebnis502.setInputType(InputType.TYPE_CLASS_NUMBER);
		edtErgebnis502.setOnFocusChangeListener(new OnFocusChangeListener() {
			@Override
			public void onFocusChange(View v, boolean hasFocus) {
				if(hasFocus){
					v.setBackgroundColor(Color.rgb(255, 140, 0));
					edtGesamtergebnis.setBackgroundColor(defaultColor);
					edtErgebnis501.setBackgroundColor(defaultColor);
					edtVolle251.setBackgroundColor(defaultColor);
					edtVolle252.setBackgroundColor(defaultColor);
					edtAbr251.setBackgroundColor(defaultColor);
					edtAbr252.setBackgroundColor(defaultColor);
					edtFehl251.setBackgroundColor(defaultColor);
					edtFehl252.setBackgroundColor(defaultColor);
				}
			}
		});
		
		edtVolle251.setInputType(InputType.TYPE_CLASS_NUMBER);
		edtVolle251.setOnFocusChangeListener(new OnFocusChangeListener() {
			@Override
			public void onFocusChange(View v, boolean hasFocus) {
				if(hasFocus){
					refreshVolle1(v);
				}
			}
		});
		
		edtVolle252.setInputType(InputType.TYPE_CLASS_NUMBER);
		edtVolle252.setOnFocusChangeListener(new OnFocusChangeListener() {
			@Override
			public void onFocusChange(View v, boolean hasFocus) {
				if(hasFocus){
					refreshVolle2(v);
				}
			}
		});
		
		edtAbr251.setInputType(InputType.TYPE_CLASS_NUMBER);
		edtAbr251.setOnFocusChangeListener(new OnFocusChangeListener() {
			@Override
			public void onFocusChange(View v, boolean hasFocus) {
				if(hasFocus){
					refreshAbr1(v);
				}
			}
		});
		
		edtAbr252.setInputType(InputType.TYPE_CLASS_NUMBER);
		edtAbr252.setOnFocusChangeListener(new OnFocusChangeListener() {
			@Override
			public void onFocusChange(View v, boolean hasFocus) {
				if(hasFocus){
					refreshAbr2(v);
				}
			}
		});
		
	}
	
	private void initListener(){		
		mSpeichernButton.setOnClickListener(mVereinAnlegenOkListener);
		mAbbruchButton.setOnClickListener(mVereinAnlegenAbbruchListener);
		
		mSpielgruppeSpinner.setOnItemSelectedListener(mSpinnerSpielgruppeItemAuswahlListener);
	}
	
	private void initContextMenu(){
	}
	
	private void initDatabase(){
	}
	
	private void cleanDatabase(){
	}
	
	private final OnClickListener mVereinAnlegenOkListener = new OnClickListener() {
		public void onClick(View v) {
			speichern();
		}
	};

	private final OnClickListener mVereinAnlegenAbbruchListener = new OnClickListener() {
		public void onClick(View v) {
			finish();
		}
	};
	
	private void refreshVolle1(View v){
		v.setBackgroundColor(Color.rgb(255, 140, 0));
		edtGesamtergebnis.setBackgroundColor(defaultColor);
		edtErgebnis501.setBackgroundColor(defaultColor);
		edtErgebnis502.setBackgroundColor(defaultColor);
		edtVolle252.setBackgroundColor(defaultColor);
		edtAbr251.setBackgroundColor(defaultColor);
		edtAbr252.setBackgroundColor(defaultColor);
		edtFehl251.setBackgroundColor(defaultColor);
		edtFehl252.setBackgroundColor(defaultColor);
	}
	
	private void refreshVolle2(View v){
		v.setBackgroundColor(Color.rgb(255, 140, 0));
		edtGesamtergebnis.setBackgroundColor(defaultColor);
		edtErgebnis501.setBackgroundColor(defaultColor);
		edtErgebnis502.setBackgroundColor(defaultColor);
		edtVolle251.setBackgroundColor(defaultColor);
		edtAbr251.setBackgroundColor(defaultColor);
		edtAbr252.setBackgroundColor(defaultColor);
		edtFehl251.setBackgroundColor(defaultColor);
		edtFehl252.setBackgroundColor(defaultColor);
	}
	
	private void refreshAbr1(View v){
		v.setBackgroundColor(Color.rgb(255, 140, 0));
		edtGesamtergebnis.setBackgroundColor(defaultColor);
		edtErgebnis501.setBackgroundColor(defaultColor);
		edtErgebnis502.setBackgroundColor(defaultColor);
		edtVolle251.setBackgroundColor(defaultColor);
		edtVolle252.setBackgroundColor(defaultColor);
		edtAbr252.setBackgroundColor(defaultColor);
		edtFehl251.setBackgroundColor(defaultColor);
		edtFehl252.setBackgroundColor(defaultColor);
	}
	
	private void refreshAbr2(View v){
		v.setBackgroundColor(Color.rgb(255, 140, 0));
		edtGesamtergebnis.setBackgroundColor(defaultColor);
		edtErgebnis501.setBackgroundColor(defaultColor);
		edtErgebnis502.setBackgroundColor(defaultColor);
		edtVolle251.setBackgroundColor(defaultColor);
		edtVolle252.setBackgroundColor(defaultColor);
		edtAbr251.setBackgroundColor(defaultColor);
		edtFehl251.setBackgroundColor(defaultColor);
		edtFehl252.setBackgroundColor(defaultColor);
	}
	
	private void refreshFehl1(View v){
		v.setBackgroundColor(Color.rgb(255, 140, 0));
		edtGesamtergebnis.setBackgroundColor(defaultColor);
		edtErgebnis501.setBackgroundColor(defaultColor);
		edtErgebnis502.setBackgroundColor(defaultColor);
		edtVolle251.setBackgroundColor(defaultColor);
		edtVolle252.setBackgroundColor(defaultColor);
		edtAbr251.setBackgroundColor(defaultColor);
		edtAbr252.setBackgroundColor(defaultColor);
		edtFehl252.setBackgroundColor(defaultColor);
	}
	
	private void refreshFehl2(View v){
		v.setBackgroundColor(Color.rgb(255, 140, 0));
		edtGesamtergebnis.setBackgroundColor(defaultColor);
		edtErgebnis501.setBackgroundColor(defaultColor);
		edtErgebnis502.setBackgroundColor(defaultColor);
		edtVolle251.setBackgroundColor(defaultColor);
		edtVolle252.setBackgroundColor(defaultColor);
		edtAbr251.setBackgroundColor(defaultColor);
		edtAbr252.setBackgroundColor(defaultColor);
		edtFehl251.setBackgroundColor(defaultColor);
	}
	
	private void speichern() {
		if(validate()){
			mErgebnisSpeicher = new ErgebnisSpeicher(this);
			
			errechneGesamtErgebnis();
			mErgebnisVO.spielerId = mSpielerVO.id;
			
			if(!isEditMode){
				mErgebnisVO.id = 0;
			}
			
			mErgebnisSpeicher.speichereErgebnis(mErgebnisVO);
			//finish();
		}
	}
	
	private boolean validate(){
		if(edtGesamtergebnis.getText().length() < 1){
			edtGesamtergebnis.setText("0");
		}
		if(edtErgebnis501.getText().length() < 1){
			edtErgebnis501.setText("0");
		}
		if(edtErgebnis502.getText().length() < 1){
			edtErgebnis502.setText("0");
		}
		if(edtAbr251.getText().length() < 1){
			edtAbr251.setText("0");
		}
		if(edtAbr252.getText().length() < 1){
			edtAbr252.setText("0");
		}
		if(edtFehl251.getText().length() < 1){
			edtFehl251.setText("0");
		}
		if(edtFehl252.getText().length() < 1){
			edtFehl252.setText("0");
		}
		
		if(edtVolle251.getText().length() < 1){
			edtVolle251.setText("0");
		}
		if(edtVolle252.getText().length() < 1){
			edtVolle252.setText("0");
		}
		
		if(edtGesamtergebnis.getText().length() > 0){
			return true;
		}
		return false;
	}
	
	private void errechneGesamtErgebnis(){
		int gesamt = 0;
		validate();
		int volle1 = Integer.parseInt(edtVolle251.getText().toString());
		int volle2 = Integer.parseInt(edtVolle252.getText().toString());
		
		int abr1 = Integer.parseInt(edtAbr251.getText().toString());
		int abr2 = Integer.parseInt(edtAbr252.getText().toString());
		
		int fehl1 = Integer.parseInt(edtFehl251.getText().toString());
		int fehl2 = Integer.parseInt(edtFehl252.getText().toString());
		
		int erg1 = volle1 + abr1;
		int erg2 = volle2 + abr2;
		edtErgebnis501.setText(String.valueOf(erg1));
		edtErgebnis502.setText(String.valueOf(erg2));
	 
		int ergebnis501 = Integer.parseInt(edtErgebnis501.getText().toString());
		int ergebnis502 = Integer.parseInt(edtErgebnis502.getText().toString());
		gesamt = ergebnis501 + ergebnis502;
		
		mErgebnisVO.volle251 = volle1;
		mErgebnisVO.volle252 = volle2;
		mErgebnisVO.abraeumen251 = abr1;
		mErgebnisVO.abraeumen252 = abr2;
		mErgebnisVO.ergebnis501 = erg1;
		mErgebnisVO.ergebnis502 = erg2;
		mErgebnisVO.fehl251 = fehl1;
		mErgebnisVO.fehl252 = fehl2;
		mErgebnisVO.gesamtergebnis = gesamt;
		
		edtGesamtergebnis.setText(String.valueOf(gesamt));
	}
	
	private void zeigeSpieler() {
		mSpielerSpeicher = new SpielerSpeicher(this);
		zeigeSpielerZurMannschaftId(mErgebnisVO.mannschaftId);
	}
	
	private void zeigeSpielerZurMannschaftId(long mannschaftId) {
		List<SpielerVO> spielerListeVO = mSpielerSpeicher.ladeAlleSpielerListeZurMannschaftVO(mannschaftId);

		ArrayAdapter<SpielerVO> mannschaftenAdapter = new ArrayAdapter<SpielerVO>(this,
				android.R.layout.simple_spinner_item, spielerListeVO);

		mannschaftenAdapter.setDropDownViewResource(android.R.layout.simple_spinner_item);

		mSpielgruppeSpinner.setAdapter(mannschaftenAdapter);


	}
	
	private final AdapterView.OnItemSelectedListener mSpinnerSpielgruppeItemAuswahlListener = new AdapterView.OnItemSelectedListener() {
		public void onItemSelected(AdapterView<?> arg0, View arg1, int position, long id) {
			mSelectedSpielerItemPosition = position;
			mSpielerVO = (SpielerVO) mSpielgruppeSpinner.getSelectedItem();
			if(mSelectedSpielerItemPosition <= mSpielgruppeSpinner.getAdapter().getCount()){
				mSpielgruppeSpinner.setSelection(mSelectedSpielerItemPosition);
			}else{
				mSpielgruppeSpinner.setSelection(0);
			}
		}

		public void onNothingSelected(AdapterView<?> arg0) {

		}
	};
	
	private void loadPreference(){
		mSelectedSpielerItemPosition =KegelverwaltungPreference.getInstance(this).getPreferencesInt(
				PREFERENCE_KEY_INDEX_PAARUNG_SPIELER +heimGast +mPaarungIndex);
	}
	
	private void savePreference() {
		KegelverwaltungPreference.getInstance(this).saveIntState(
				PREFERENCE_KEY_INDEX_PAARUNG_SPIELER +heimGast +mPaarungIndex, mSelectedSpielerItemPosition);
		
	}
	
}
